package com.hmall.item.web;

import com.hmall.item.constants.MyMqConstants;
import com.hmall.item.mapper.ItemMapper;
import com.hmall.item.pojo.Item;
import com.hmall.item.pojo.PageItem;
import com.hmall.item.result.PageResult;
import com.hmall.item.result.Result;
import com.hmall.item.service.ItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/item")
@Slf4j

public class ItemController {
    @Autowired
    private ItemService itemService;
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 查询所有 无条件
     */
    @GetMapping("all")
    public Result<List<Item>> all() {
        return itemService.all();
    }

    /**
     * 无条件分页查询
     */
    @GetMapping("/list")
    public PageResult<Item> list(Integer page, Integer size) {
        PageItem pageItem = new PageItem();
        pageItem.setPage(page);
        pageItem.setSize(size);
        log.info("分页查询：{}", pageItem);
        return itemService.pageInfo(pageItem);
    }

    /**
     * es的数据导入 使用的是item中status=1的上架的商品
     */
    @GetMapping("/pageEs")
    public PageResult<Item> pageES(Integer page, Integer size) {
        PageItem pageItem = new PageItem();
        pageItem.setPage(page);
        pageItem.setSize(size);
        log.info("分页查询：{}", pageItem);
        return itemService.pageInfoES(pageItem);
    }

    /**
     * 根据id查询
     */
    @GetMapping("/{id}")
    public Result<Item> getItemById(@PathVariable Long id) {
        log.info("查询的id：{}", id);
//        需要status不等于3才行
        Item item = itemService.getByIdAndStatus(id);
        return Result.success(item);
    }

    //============================================异步调用mq发送消息 保证DB和es的数据一致性===============
    @PostMapping
    public Result putItem(@RequestBody Item item) {
        log.info("新增商品:{}", item);
        item.setCreateTime(new Date());
        item.setUpdateTime(new Date());
        itemMapper.insert(item);

//        异步调用MQ同步数据
        rabbitTemplate.convertAndSend(MyMqConstants.ITEM_EXCHANGE, MyMqConstants.ITEM_INSERT_KEY, item.getId());
        return Result.success();
    }

    /**
     * 上下架商品（下架 2 删除 3 正常1（上架） status）
     */
    @PutMapping("/status/{id}/{status}")
    public Result updateItemByStatus(@PathVariable long id, @PathVariable Integer status) {
        String str = status == 1 ? "上架" : "下架";
        log.info(str + "id是；{}", id);
        Item item = new Item();
        item.setId(id);
        item.setStatus(status);
        itemService.updateItemByStatus(item);
        return Result.success();
    }

    /**
     * 修改商品
     */
    @PutMapping
    public Result updateItem(@RequestBody Item item) {
        log.info("修改商品信息，{}", item);
        itemService.updateItem(item);
        return Result.success();
    }

    /**
     * 删除商品 status = 3
     */
    @DeleteMapping("/{id}")
    public Result delItemById(@PathVariable long id) {
        log.info("根据id删除商品，id:{}", id);
        itemService.delItemById(id);
        return Result.success();
    }
}
